#ifndef LOG_H
#define LOG_H

#include <QtCore>
#include <QList>

#include "Output.h"
#include "Types.h"

namespace Logger {

/**
 * @brief System logujący zdarzenia zachodzące w aplikacji.
 *
 * Zbiera informacje od wszystkich modułów systemu, a nastepnie
 * może wyświetlić je na ekranie bądź zapisac do pliku.
 * Przekazywane mogą być informacje o wykonanych operacjach,
 * ostrzeżenia, błędy, itp. Komunikacja z innymi modułami odbywa
 * się przy pomocy mechanizmu sygnałów i slotów.
 *
 * System zaimplementowany jako singleton.
 **/
class Log : public QObject
{

	Q_OBJECT

public:
	/**
	 * Zwrócenie referencji na właściwy obiekt
	 *
	 * @return referencja na utworzony obiekt klasy Logger
	 **/
	static Log & get() {
		static Log log;
		return log;
	}

	/**
	 * Usunięcie wszystkich podłączonych wyjść
	 **/
	~Log();

	/**
	 * Dodanie nowego wyjścia na dane z loggera. Wszystkie nadchodzące
	 * komunikaty są przekazywane do odpowiednich wyjść, zależnie od
	 * filtra ustawionego dla danego wyjścia (niektóre z nich mogą łapać
	 * wszystkie komunikaty, inne mogą zapisywać/wyświetlać jedynie
	 * wiadomości o krytycznych błędach).\n
	 * \n
	 * Logger sam zajmuje się zwalnianiem dołączonych wyjść, nie należy
	 * więc robić tego ręcznie.
	 *
	 * @param out wskaźnik na obiekt będący wyjściem konsoli
	 **/
	void addOutput(Output * out);

public slots:
	/**
	 * Reakcja na nową wiadomość nadchodzącą z innego modułu
	 *
	 * @param msg treść wiadomości
	 * @param type typ wiadomości
	 **/
	void onNewMessage(const QString & msg, int type = mtInfo);

private:
	/**
	 * Konstruktor ukryty, jako że klasa jest singletonem
	 **/
	Log();

	/// Wszystkie podpięte wyjścia
	QList<Output *> outputs_;
};

} // namespace Logger

#endif // LOG_H
